package repository

import (
	"ia/common/storage"

	"gorm.io/gorm"
)

/*
 * 单表操作
 */
// type Curd[T any] interface {
// 	Create(T) error
// 	Delete(T, []int) error
// 	Update(T) error
// 	List(T) error
// }

type curd[T any] struct {
	db      *gorm.DB
	omit    []string
	preload []string
}

func NewCurd() *curd[any] {
	return &curd[any]{
		db: storage.GDB1,
	}
}

func (impl *curd[T]) Create(t T) error {
	return impl.db.Create(t).Error
}

func (impl *curd[T]) Delete(t T, idList []int) error {
	return impl.db.Delete(t, "id in ?", idList).Error
}

func (impl *curd[T]) Update(t T) error {
	return impl.db.Save(t).Error
}

func (impl *curd[T]) List(t T) error {
	db := impl.db
	for _, v := range impl.preload {
		if v != "" {
			db.Preload(v)
		}
	}
	return db.Omit(impl.omit...).Find(t).Error
}

// -----------------------------------
// -----------------------------------
func (impl *curd[T]) OmitDefault() *curd[T] {
	return impl.Omit("password")
}

func (impl *curd[T]) Omit(omit ...string) *curd[T] {
	impl.omit = omit
	return impl
}

func (impl *curd[T]) Preload(preload ...string) *curd[T] {
	impl.preload = preload
	return impl
}

// func Create[T any](t *T) error {
// 	if err := storage.GDB1.Create(&t).Error; err != nil {
// 		return err
// 	}
// 	return nil
// }

// func List[T any](t *[]*T) error {
// 	if err := storage.GDB1.Find(&t).Error; err != nil {
// 		return err
// 	}
// 	return nil
// }
